(function () {

  //定义一个表示人的类
  class Person {
    /**
     * TS中可以在属性前添加属性的修饰符
     * public 修饰的属性可以在任意位置访问（修改）默认值
     * private 私有属性，只能在类内部进行访问（修改）
     *    通过在类中添加方法使得私有属性可以被外部访问
     * protected 受保护的属性，只能在当前类和当前类的子类中访问（修改）
     */
    // private name: string;
    // private age: number;

    // constructor(name: string, age: number) {
    //   this.name = name;
    //   this.age = age;
    // }

    private _name: string;
    private _age: number;

    constructor(name: string, age: number) {
      this._name = name;
      this._age = age;
    }

    /**
     * getter方法用来读取属性
     * setter方法用来设置属性
     *    它们被称为属性的存取器
     */
    // 定义方法，用来获取name、age属性
    /*getName() {
      return this.name;
    }
    getAge() {
      return this.age;
    }*/

    // 定义方法，用来设置name、age属性
    /*setName(name: string) {
      this.name = name;
    }
    setAge(age: number) {
      if (age > 0) {
        this.age = age;
      }
    }*/

    // TS中设置getter方法的方式
    get name() {
      return this._name;
    }
    get age() {
      return this._age;
    }

    // TS中设置setter方法的方式
    set name(value: string) {
      this._name = value;
    }
    set age(value: number) {
      if (value > 1) {
        this._age = value;
      }
    }

  }

  const person = new Person('诸葛亮', 22);
  // console.log(person.getName());
  // console.log(person.getAge());

  // person.setName('猪八戒');
  // person.setAge(-1);
  // console.log(person.getName());
  // console.log(person.getAge());

  // 私有属性不允许直接修改
  // person._name = '猪八戒';
  // person._age = 22;

  console.log(person.name);
  console.log(person.age);
  // TS设置值、获取值
  person.name = '猪八戒';
  person.age = 38;
  console.log(person.name + ',' + person.age);


  class A {
    protected num: number;

    constructor(num: number) {
      this.num = num;
    }
  }

  class B extends A {
    test() {
      console.log(this.num);
    }
  }

  const a = new A(111);
  //a.num = 100; // 属性“num”受保护，只能在类“A”及其子类中访问
  const b = new B(223);
  // b.num = 333; // 属性“num”受保护，只能在类“A”及其子类中访问
  b.test();

  /*
  等价于下面的C
  class C {
    name: string;
    age: number;

    // 可以直接将属性定义在构造函数中
    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }
  }*/

  class C {
    // 可以直接将属性定义在构造函数中
    constructor(public name: string, public age: number) {
    }
  }
  const c = new C('张三丰', 111);
  console.log(c);
  

})();